package cara.tp1.server;

import cara.tp1.server.domain.Livre;
import cara.tp1.server.domain.Personne;

import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * User: Simon BILLIAU
 * Date: 03/02/2014
 */
@WebService(endpointInterface = "cara.tp1.server.Usager", serviceName = "Usager")
public class UsagerImpl implements Usager {

    private Personne usager;

    BibliothequeImpl bibliotheque = BibliothequeImpl.getInstance();


    @Override
    public void emprunterLivre(String isbn,Personne personne) throws LivreInconnuExeption, EmprunterExeption {

        Map<Personne,List<Livre>> personnelivresEmprunte =  bibliotheque.getLivresEmprunte();

        List<Livre> livresEmprunteur = personnelivresEmprunte.get(personne);

        if(livresEmprunteur==null){
            livresEmprunteur = new ArrayList<Livre>();
        }else{
            if(livresEmprunteur.size() >=3) throw new EmprunterExeption("Un utilisateur ne peut reserver que 3 livres maximum");
        }

        //recherche du libre en fonction de son ISBN
        List<Livre> livres = bibliotheque.getLivreList();
        Livre livrePourEmprunte = null;

        for (Livre livre : livres) {
            if(livre.getISBN().toLowerCase().equals(isbn.toLowerCase()) && livre.getEmprunteur() ==null) {
                livrePourEmprunte= livre;
                break;
            }
        }

        if(livrePourEmprunte==null) throw new LivreInconnuExeption("Le livre ayant le numero ISBN : " + isbn + " n'est pas disponible");

        livresEmprunteur.add(livrePourEmprunte);
        livrePourEmprunte.setEmprunteur(personne);
        personnelivresEmprunte.put(personne,livresEmprunteur);

    }

    @Override
    public void restituerLivre(String isbn,Personne personne) {
        Map<Personne,List<Livre>> personnelivresEmprunte =  bibliotheque.getLivresEmprunte();

        List<Livre> livresEmprunteur = personnelivresEmprunte.get(personne);
        Livre livreEmprunte = null;

        for (Livre livreIter : livresEmprunteur) {
            if(livreIter.getISBN().toLowerCase().equals(isbn.toLowerCase())){
                livreEmprunte = livreIter;
            }
        }

        livresEmprunteur.remove(livreEmprunte);

        //Mise à jour des emprunts
        personnelivresEmprunte.put(personne,livresEmprunteur);

        livreEmprunte.setEmprunteur(null);
    }

    @Override
    public void reserverLivre(String isbn,Personne personne) throws LivreNonEmprunteExeption, LivreDejaReserverExeption, LivreInconnuExeption {
        Map<Personne,List<Livre>> personnelivresEmprunte =  bibliotheque.getLivresEmprunte();
        List<Livre> livreList = bibliotheque.getLivreList();

        Livre livre = new Livre();
        livre.setISBN(isbn);

        //livre emprunté par toutes les personnes  sauf par la personne voulant reserver
        List<Livre> livreEmprunte = new ArrayList<Livre>();
        for (Map.Entry<Personne, List<Livre>> personneListEntry : personnelivresEmprunte.entrySet()) {
            if(!personne.equals(personneListEntry.getKey())){
                livreEmprunte.addAll(personneListEntry.getValue());
            }
        }

        Livre livreAReserver = null;

        try {
            livreAReserver = livreList.get(livreList.indexOf(livre));
        }   catch (IndexOutOfBoundsException e){
            throw new LivreInconnuExeption("Le livre ayant le numéro ISBN: " +isbn+" est inconnu");
        }

        if(!livreEmprunte.contains(livre)){
            throw  new LivreNonEmprunteExeption("Le livre n'est pas emprunté");

        }else if (null != livreAReserver.getReserve()){

            throw new LivreDejaReserverExeption("Ce livre est déjà réservé");

        } else{
            livreAReserver.setReserve(personne);
        }

    }

    @Override
    public List<Livre> consulterTousLesLivres() {
        return bibliotheque.getLivreList();
    }

    @Override
    public List<Livre> consulterLivreParTitre(String titre) {
        List<Livre> livres = bibliotheque.getLivreList();
        List<Livre> livreParAuteur = new ArrayList<Livre>();

        for (Livre livre : livres) {
            if(livre.getTitre().toLowerCase().equals(titre.toLowerCase())){
                livreParAuteur.add(livre);
            }

        }
        return  livreParAuteur;
    }

    @Override
    public Livre consulterLivreParISBN(String isbn) {
        List<Livre> livres = bibliotheque.getLivreList();
        Livre livreParISBN = new Livre();

        for (Livre livre : livres) {
            if(livre.getISBN().toLowerCase().equals(isbn.toLowerCase())){
                return livre;
            }

        }
        return  null;

    }
}
